با توجه به داده بانک جهانی به سوالات زیر پاسخ دهید. برای استفاده از داده از سه فایل زیر استفاده نمایید. داده نام کشورها: WDICountry داده نام سری های زمانی: WDISeries داده کل: WDIData در صورتی که داده را در اختیار ندارید می توانید از بسته WDI استفاده نموده و داده های مورد نظر را استخراج نمایید.


بارگذاری داده ها و کتابخانه ها:

library(readr)
library(dplyr)
library(ggplot2)
library(highcharter)
library(stringr)

wdi_data = read_csv('data/WDIData.csv')


۱. ده کشور فقیر دنیا را بیابید. نمودار درآمد روزانه آنها را رسم کنید. چند درصد از اعضای این کشورها زیر خط فقر هستند؟ متوسط عمر در این کشورها چقدر است؟

برای حل این سوال ابتدا ستون های مورد نظر را برای سال ۲۰۱۶ پیدا می کنیم. فقط از آنجایی که خط فقر NA زیادی داشت از سال ۲۰۱۴ آن استفاده می کنیم. سپس بر اساس فقر مرتب کرده و ده کشور فقیر را انتخاب می کنیم. سپس خط فقر و امید به زندگی را رسم می کنیم. در نهایت نمودار را رسم می کنیم.

poverty <- wdi_data %>%  filter(`Indicator Code`== 'NY.GDP.PCAP.PP.CD') %>% 
  select(country = `Country Name`, poverty = `2016`)

income <- wdi_data %>% filter(`Indicator Code`== 'NY.ADJ.NNTY.CD') %>% 
  select(country = `Country Name`, income = `2016`)

poverty_line <- wdi_data %>% filter(`Indicator Code`== 'SI.POV.NAHC') %>% 
  select(country = `Country Name`, poverty_line = `2014`)

life_expectancy <- wdi_data %>% filter(`Indicator Code`== 'SP.DYN.LE00.IN') %>% 
  select(country = `Country Name`, life_expectancy = `2016`)

population <- wdi_data %>% filter(`Indicator Code`== 'SP.POP.TOTL') %>% 
  select(country = `Country Name`, population = `2016`)

poverty <- poverty %>%  inner_join(income, by = c("country")) %>% 
  inner_join(population, by = c("country")) %>% 
  inner_join(poverty_line, by = c("country")) %>% 
  inner_join(life_expectancy, by = c("country")) %>% 
  arrange(poverty) %>% 
  mutate(daily_income = income/(365*population)) %>% 
  slice(1:10)
  
knitr::kable(poverty)
country poverty income population poverty_line life_expectancy daily_income
Central African Republic 698.7067 1374375431 4594621 NA 52.171 0.8195262
Burundi 777.7529 2122720795 10524117 64.9 57.481 0.5526044
Congo, Dem. Rep. 801.6301 26138587178 78736153 NA 59.621 0.9095259
Liberia 812.6739 1112973037 4613823 54.1 62.505 0.6608925
Niger 986.2070 6041624602 20672987 44.5 60.058 0.8006775
Malawi 1168.8256 3635417843 18091575 NA 63.223 0.5505352
Mozambique 1216.7928 8566275076 28829476 46.1 58.311 0.8140712
Sierra Leone 1476.2137 2676603250 7396190 NA 51.835 0.9914780
Togo 1490.5362 3020251309 7606374 NA 60.232 1.0878588
Madagascar 1506.2383 8910175309 24894551 NA 65.932 0.9805937
poverty %>% arrange(daily_income) %>% 
  hchart(type = "column", hcaes(x = country, y = daily_income)) %>% 
  hc_yAxis(title = list(text = "Daily Income")) %>% 
  hc_xAxis(title = list(text = "Country")) %>% 
  hc_title(text = "Daily Income in Poor Countries", style = list(fontWeight = "bold")) %>% 
  hc_add_theme(hc_theme_ffx())

۲. تراژدی روآندا: بر اساس داده های امید به زندگی ابتدا نمودار سالانه نمودار جعبه ایی امید به زندگی کشورها را رسم نمایید(در یک نمودار!). سپس سری زمانی امید به زندگی روآندا را به آن اضافه کنید. چه می بینید؟ چند میلیون نفر کشته شدند؟

برای حل این سوال، امید به زندگی را در تمامی سال ها بدست می آوریم. سپس نمودار را از ستونی به ردیفی به کمک melt تبدیل می کنیم. در نهایت نمودار جعبه را می کشیم.

library(reshape2)

life_expectancy <- wdi_data %>% filter(`Indicator Code`== 'SP.DYN.LE00.IN') %>% 
  select(country = `Country Name`, matches('\\d{4}')) %>% 
  melt(id.vars=c('country'))

rwd_life_expectancy <- life_expectancy %>% filter(country == 'Rwanda')
p = ggplot(data = life_expectancy, mapping = aes(x = variable, y = value)) + geom_boxplot() +
  geom_line(data = rwd_life_expectancy, mapping = aes(x = variable, y = value, group = 1, color = 'Rwanda')) + 
  xlab("Year") + ylab("Life Expectancy") + ggtitle("Average Life Expectancy Worldwide") + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) 
p

مشاهده می کنیم که در این سال ها امید به زندگی در روآندا با اختلاف از سایر کشورها کمتر است که علت آن نسل کشی توسط دولت بوده است. همچنین در زیر می بینیم که یک میلیون نفر در این دوران کشته شده اند.

rwd_death <- wdi_data %>% filter(`Indicator Code`== 'SP.DYN.CDRT.IN') %>% 
  select(country = `Country Name`, matches('\\d{4}')) %>% filter(country == 'Rwanda') %>% 
  melt(id.vars=c('country')) %>% filter(!is.na(value)) %>% 
  summarise(tot_death = 1000*sum(value))

cat("Total Death in Rwanda is", rwd_death[1,], "people.")
Total Death in Rwanda is 1053185 people.

۳. نمودار امید به زندگی و هزینه های بهداشتی را رسم کنید. چه نتیجه ایی می گیرید؟

برای حل این سوال همانند بالا داده را در باره ی هزینه های بهداشتی نیز بدست می آوریم، منتهی برای آنکه رنج آن با امید به زندگی قابل مقایسه باشد داده ها را به ۱۰۰ تقسیم می کنیم و دو نمودار را کنار یکدیگر رسم می کنیم.

health <- wdi_data %>% filter(`Indicator Code`== 'SH.XPD.CHEX.PC.CD') %>% 
  select(country = `Country Name`, matches('\\d{4}')) %>% 
  melt(id.vars=c('country')) %>% 
  mutate(value = value/100, type = 'health') %>% 
  filter(!is.na(value))

life_expectancy <- life_expectancy %>% filter(!is.na(value)) %>% mutate(type = 'life expectancy')

health_expect <- health %>% rbind(life_expectancy)

p = ggplot(data = health_expect, mapping = aes(x = variable, y = value, fill = type, color = type)) + geom_boxplot() +
  xlab("Year") + ylab("Life Expectancy or Health Cost") + ggtitle("Average Life Expectancy and Health Cost Worldwide") + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) 

همانطور که انتظار می رود، هر چه امید به زندگی به طور میانگین بالا می رود، میزان هزینه های بهداشتی و اهمیت افراد به بهداشت خود نیز افزایش پیدا می کند.


۴. آیا قدرت خرید خانواده های ایرانی در ۵۰ سال اخیر افزایش یافته است؟ برای این کار از داده های اقتصادی خانوار استفاده کنید.

برای این سوال همانند سوال بالا ردیف مناسب با ستون های مناسب را به ازای تمامی سال ها برای ایران بدست می آوریم و نمودار را می کشیم.

iran_buy_cap <- wdi_data %>% filter(`Indicator Code`== 'NY.GDP.PCAP.PP.CD') %>% 
  select(country = `Country Name`, matches('\\d{4}')) %>% 
  filter(country == 'Iran, Islamic Rep.') %>% 
  melt(id.vars=c('country')) %>% 
  filter(!is.na(value))

iran_buy_cap %>% arrange(variable) %>% 
  hchart(type = "line", hcaes(x = variable, y = value)) %>% 
  hc_yAxis(title = list(text = "Purchasing Capability")) %>% 
  hc_xAxis(title = list(text = "Year")) %>% 
  hc_title(text = "Purchasing Capability in Iran", style = list(fontWeight = "bold")) %>% 
  hc_add_theme(hc_theme_economist())

همانطور که می بینیم قدرت خرید در ایران زیاد شده است، اما در پایان سال ۲۰۱۲ که با پایان دولت قبلی همزمان است، میزان قدرت خرید به علت اختلاس ها و عدم کنترل وضعیت اقتصادی افت کرده است.


۵. رشد اقتصادی ایران را با کشورهای دیگر در طول ۲۰ سال گذشته بر حسب بیست شاخص های اقتصادی مهم مانند تولید ناخالص ملی، تورم و … ارزیابی کنید! (برای هر شاخص از تصویرسازی استفاده کنید.)

برای حل این سوال ۲۰ معیاری که مقادیر NA کمتری دارد را می یابیم و در حل مرحله داده ی جهانی را با ایران مقایسه می کنیم. نام شاخص در عنوان خطوط نمودار آمده است. البته مشاهده می کنیم که دو نمودار تقریبا داده ای ندارند.

world_ec <- wdi_data %>% filter(`Indicator Code`== 'NE.EXP.GNFS.CD') %>% 
  select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]')) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'NY.GDP.PCAP.CD') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'NY.GNP.MKTP.CD') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'NE.GDI.FTOT.KD.ZG') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'BX.KLT.DINV.CD.WD') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'BM.GSR.GNFS.CD') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'BN.GSR.FCTY.CD') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'FP.CPI.TOTL.ZG') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'FM.LBL.BMNY.GD.ZS') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'NV.AGR.TOTL.ZS') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'NE.CON.TETC.ZS') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'NE.CON.GOVT.ZS') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'NV.IND.MANF.ZS') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'MS.MIL.XPND.GD.ZS') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'TG.VAL.TOTL.GD.ZS') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'NY.GDP.TOTL.RT.ZS') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'NE.TRD.GNFS.ZS') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'FS.AST.DOMS.GD.ZS') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'NY.GNP.MKTP.PP.CD') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]'))) %>% 
  rbind(wdi_data %>% filter(`Indicator Code`== 'SH.UHC.NOP1.TO') %>% 
          select(country = `Country Name`, index = `Indicator Name`, matches('^199[6-9]|^20[0-1][0-9]')))

world_ec_m <- world_ec %>% 
  melt(id.vars=c('country', 'index')) %>% 
  filter(!is.na(value)) %>% 
  group_by(index)
  


plots <- world_ec_m %>% 
  do(
    plots = ggplot(.,aes(x = variable, y = value, color = index)) + geom_boxplot() +
      xlab("Year") + ggtitle("Worldwide Economic vs. Iran") +
      theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
      geom_line(data = subset(.,country == 'Iran, Islamic Rep.'),aes(x = variable, y = value, group = 1, color = 'Iran, Islamic Rep.'))
  )
plots$plots
[[1]]


[[2]]


[[3]]


[[4]]


[[5]]


[[6]]


[[7]]


[[8]]


[[9]]


[[10]]


[[11]]


[[12]]


[[13]]


[[14]]


[[15]]


[[16]]


[[17]]


[[18]]


[[19]]


[[20]]

همانطور که در نمودارها می بینیم، ایران تقریبا بر روی میانگین کشورها قرار دارد، اما مقادیری همچون هزینه ی مصرف نهایی از کشورهای دیگر بسیار کمتر است و سرمایه گذاری در خارج آن صفر است. هم چنین میزان تجارت از میانگین کمتر است و میزان اجاره ی منابع طبیعی بسیار بیشتر از سایر کشورها است. در کل ایران اقتصادی متوسط رو به پایین دارد.


۶. در قسمت قبل با استفاده از روش خوشه بندی k-means داده ها را به سه دسته تقسیم کنید. ایران در کدام دسته می گنجد؟ (پیش از خوشه بندی طبیعتا داده را باید پاکسازی و استاندارد سازی نمایید.)

برای پاکسازی داده ها مقادیر ستون های NA را برابر با صفر قرار می دهیم، سپس برای هر کشور، میانگین مقادیر ستون ها را محاسبه می کنیم. در نهایت به کمک kmeans داده های سال های مختلف برای کشورهای مختلف را به سه دسته تقسیم می کنیم.

# cleaning data
world_ec_cluster <- world_ec
world_ec_cluster[is.na(world_ec)] = 0
patt = "Africa|America|Asia|dividend|Euro|income|members|Middle|only|Sub|total|World"

world_ec_cluster <- world_ec_cluster %>% group_by(country) %>% 
  filter(!grepl(patt,country)) %>% 
  summarise_at(c(2:22), mean)

set.seed(1234)
clusters = kmeans(world_ec_cluster[,2:22], 3)

world_ec_cluster$cluster_no = as.integer(clusters$cluster)

iran_cluster = world_ec_cluster %>% 
  filter(country == 'Iran, Islamic Rep.')

cat("Iran cluster:", iran_cluster[1,23,1])
Iran cluster: 3
str(clusters)
List of 9
 $ cluster     : int [1:223] 3 3 3 3 3 3 3 3 3 3 ...
 $ centers     : num [1:3, 1:21] 5.44e+11 1.52e+11 6.12e+09 5.85e+11 1.53e+11 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:3] "1" "2" "3"
  .. ..$ : chr [1:21] "1996" "1997" "1998" "1999" ...
 $ totss       : num 9.08e+25
 $ withinss    : num [1:3] 6.21e+24 3.62e+24 3.11e+24
 $ tot.withinss: num 1.29e+25
 $ betweenss   : num 7.79e+25
 $ size        : int [1:3] 2 12 209
 $ iter        : int 3
 $ ifault      : int 0
 - attr(*, "class")= chr "kmeans"

نتیجه فوق نشان می دهد ایران در دسته ی سوم قرار دارد.


۷. به وسیله تحلیل مولفه اصلی بعد داده رو به دو کاهش دهید سپس خوشه های به دست آمده در قسمت قبل را بر روی آن نمایش دهید. آیا عملکرد روش خوشه بندی شما مطلوب بوده است؟


۸. با استفاده از داده روشی برای پیش بینی رشد اقتصادی ایران در سال آینده ارائه دهید.


۹. سوالهای ۵ تا ۷ را ابتدا برای ۲۰ شاخص سلامت سپس بر حسب ۲۰ شاخص آموزشی تکرار کنید.


۱۰. کشورهای دنیا را بر حسب ۶۰ شاخص اقتصادی، سلامت و آموزش با روش سلسله مراتبی خوشه بندی کرده و دندروگرام آن را رسم نمایید. اگر داده ها بر سه دسته تقسیم شوند ایران در کدام دسته می گنجد؟


۱۱. سه یافته جالب از داده ها استخراج کنید.